package Greedy;

import java.util.Arrays;
import java.util.stream.IntStream;

public class p1005K次取反后最大化的数组和 {
    class Solution {
        public int largestSumAfterKNegations(int[] nums, int k) {
            // 将数组按照绝对值大小从大到小排序，注意要按照绝对值的大小
            nums = IntStream.of(nums).boxed()
                    .sorted((n1, n2)->Math.abs(n2) - Math.abs(n1))
                    .mapToInt(n -> n).toArray();
            int len = nums.length;
            for (int i = 0; i < len; i++) {
                if (k > 0 && nums[i] <= 0){
                    nums[i] = -nums[i];
                    k--;
                }
            }
            // 如果k还有剩余就一直改变绝对值最小的数
            // k为偶数等效于没变，k为奇数则变为相反数
            if(k % 2 == 1) nums[len - 1] = -nums[len - 1];
            return Arrays.stream(nums).sum();
        }
    }
}
